# -*- coding: utf-8 -*-
'''
@author: av
'''
# импорт с псевдонимом ET
import xml.etree.ElementTree as ET
import uuid
import os.path, sys
sys.path.append(os.path.abspath(os.path.dirname(__file__) + '/UkrainianCadastralExchangeFile'))
from point import Point
from polyline import *
# хранит все точки, усовершенствованный список позволяет получать Point по UIDP
from pointslist import *
from polylinelist import *
from boundary import *

class ImportXML():
    '''
    ипорт обменных файлов XML
    '''
    # root = None
    fileDate = ('AdditionalPart/ServiceInfo/FileID/FileDate')
    pointsList = PointsList()
    polylineList = PolylineList()
    boundaryList = []

    def __init__(self):
        '''
        Constructor
        '''
        
    def prepare(self, fileXml):
        # Открываем файл XML        
        xmlTree = ET.parse(unicode(fileXml))
        root = xmlTree.getroot()
        self.root = root
        return root
        # LicenseSeries = root.find('AdditionalPart/InfoLandWork/Executor/License/LicenseSeries')
        # nnn = root.find('AdditionalPart/ServiceInfo/FileID/FileDate')
        # print 'Версия ', nnn.text, 'Серия лицензии', LicenseSeries.text
        # nnn2 = root.find('InfoPart/MetricInfo/PointInfo')

    def getBoudary (self):
        '''возвращает список полилиний из которых состоит внешняя граница земельного участка'''
        self.boundaryList = []
        path = self.root.find('InfoPart/CadastralZoneInfo/CadastralQuarters/CadastralQuarterInfo/Externals/Boundary/Lines')
        for entr in path:
            ULID = entr.findtext('ULID')
            # получаем ссылку на полилинию по её ULID
            polyline = self.polylineList.getByUIDP(ULID)
            self.boundaryList.append(polyline)
        return self.boundaryList                
    
    def getFileDate(self):
        return self.root.findtext(self.fileDate)
        pass
            
    def setFileDate(self):
        pass
     
    def getPoints(self):
        '''
        Возвращает список из объектов Point
        '''
        self.pointsList = PointsList()
        path = self.root.find('InfoPart/MetricInfo/PointInfo')
        for t in path:
            point = Point()
            point.setUIDP(t.findtext('UIDP'))
            point.setPN(t.findtext('PN'))
            point.setX(t.findtext('X'))
            point.setY(t.findtext('Y'))
            point.setH(t.findtext('H'))
            # добавляем точку в список
            self.pointsList.append(point)
        return self.pointsList     
            
    def getPolylines(self):
        '''Возвращает список из объектов Polyline
        '''
        self.polylineList = PolylineList()
        path = self.root.find('InfoPart/MetricInfo/Polyline')
        numPolilane = 0
        for entr in path:
            polyline = Polyline()
            polyline.ULID = entr.findtext('ULID')
            polyline.length = entr.findtext('Length')
            polyline.points = []
            pointsXML = entr.find('Points')
            # счетчик испотльзуется для добавления точки в список
            for t1 in pointsXML:
                # получаем точку по её UIDP
                point = Point()
                point = self.pointsList.getByUIDP(t1.text)
                polyline.points.append(point)                
            self.polylineList.insert(numPolilane, polyline)
            numPolilane += 1
        return self.polylineList
 
    def getAdjacentUnits(self):
        '''Возвращает список из смежников земельного участка
        '''
        path=[]
        self.polylineList = PolylineList()
        path = self.root.find('UkrainianCadastralExchangeFile/InfoPart/CadastralZoneInfo/CadastralQuarters/CadastralQuarterInfo/Parcels/ParcelInfo/AdjacentUnits')
        return path
    
if __name__ == '__main__':
            this = ImportXML()
            r = this.prepare('g.xml')
            #===================================================================
            # pointsXML = this.getPoints()
            # polylines = this.getPolylines()
            # for p in polylines:
            #     print 'Полилиния ULID', p.ULID
            #     print 'состоит из точек:'
            #     hh = p.points
            #     print 'колличество', hh.__len__()  
            #     for pt in hh:
            #         print 'UIDP=', pt.UIDP, 'PN=', pt.PN, '  ', pt.X, pt.Y
            # bound = this.getBoudary()
            # print 'Внешний контур состоит из ', bound.lines.__len__(), 'линий :'
            # d1 = bound.lines
            # for u in d1:
            #     print 'ULID', u.ULID
            #===================================================================
